{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":30839,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\nuser_secrets = UserSecretsClient()\ngroq_api_key = user_secrets.get_secret(\"groq_api_key\")\nhf_api_key = user_secrets.get_secret(\"hf_api_key\")\nNEO4J_PASSWORD = user_secrets.get_secret(\"NEO4J_PASSWORD\")\nNEO4J_URI = user_secrets.get_secret(\"NEO4J_URI\")\nNEO4J_USERNAME = user_secrets.get_secret(\"NEO4J_USERNAME\")\nimport huggingface_hub\nhuggingface_hub.login(token=hf_api_key)\nhuggingface_hub.auth_list()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:10:16.423385Z","iopub.execute_input":"2025-01-24T11:10:16.423763Z","iopub.status.idle":"2025-01-24T11:10:18.324817Z","shell.execute_reply.started":"2025-01-24T11:10:16.423700Z","shell.execute_reply":"2025-01-24T11:10:18.323836Z"}},"outputs":[{"name":"stdout","text":"  name   | token          \n---------|---------------\n* llms   | hf_****zPtR    \n","output_type":"stream"}],"execution_count":2},{"cell_type":"markdown","source":"### Important Links\n- https://neo4j.com/labs/genai-ecosystem/langchain/\n- https://python.langchain.com/docs/integrations/vectorstores/neo4jvector/\n- https://python.langchain.com/docs/tutorials/graph/\n- https://www.tensorops.ai/post/knowledge-graph-rag-vs-vector-db-rag-is-it-time-for-graphdbs-to-shine#:~:text=Conclusion,the%20computational%20challenges%20in%20retrieval.\n\nSpecial Mention : \nThe following Youtube Video helped a lot in Learning Graph RAG using Neo4j,\n\nhttps://www.youtube.com/watch?v=3NP1llvtrbI&ab_channel=FarzadRoozitalab%28AIRoundTable%29","metadata":{}},{"cell_type":"markdown","source":"## Neo4j Login","metadata":{}},{"cell_type":"code","source":"from langchain_community.graphs import Neo4jGraph\nfrom langchain_groq import ChatGroq\nfrom typing import TypedDict, Annotated, List, Union\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.pydantic_v1 import BaseModel,Field\nfrom langchain_huggingface import HuggingFaceEmbeddings\nimport pandas as pd\nfrom typing import List\n# from pyprojroot import here\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:10:18.326126Z","iopub.execute_input":"2025-01-24T11:10:18.326493Z","iopub.status.idle":"2025-01-24T11:10:20.333967Z","shell.execute_reply.started":"2025-01-24T11:10:18.326463Z","shell.execute_reply":"2025-01-24T11:10:20.332886Z"}},"outputs":[{"name":"stderr","text":"/usr/local/lib/python3.10/dist-packages/IPython/core/interactiveshell.py:3553: LangChainDeprecationWarning: As of langchain-core 0.3.0, LangChain uses pydantic v2 internally. The langchain_core.pydantic_v1 module was a compatibility shim for pydantic v1, and should no longer be used. Please update the code to import from Pydantic directly.\n\nFor example, replace imports like: `from langchain_core.pydantic_v1 import BaseModel`\nwith: `from pydantic import BaseModel`\nor the v1 compatibility namespace if you are working in a code base that has not been fully upgraded to pydantic 2 yet. \tfrom pydantic.v1 import BaseModel\n\n  exec(code_obj, self.user_global_ns, self.user_ns)\n","output_type":"stream"}],"execution_count":3},{"cell_type":"code","source":"\ngraph = Neo4jGraph(\n    url=NEO4J_URI,\n    username=NEO4J_USERNAME,\n    password=NEO4J_PASSWORD)\n\nllm_model = ChatGroq(api_key = groq_api_key,\n                     model_name = 'llama-3.3-70b-versatile')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:10:24.741266Z","iopub.execute_input":"2025-01-24T11:10:24.741809Z","iopub.status.idle":"2025-01-24T11:10:29.922026Z","shell.execute_reply.started":"2025-01-24T11:10:24.741775Z","shell.execute_reply":"2025-01-24T11:10:29.920964Z"}},"outputs":[],"execution_count":4},{"cell_type":"code","source":"import torch\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\n\nembeddings = HuggingFaceEmbeddings(model_name=\"jinaai/jina-embeddings-v3\",\n                                  encode_kwargs = {'normalize_embeddings': True},\n                                   model_kwargs = {'device': device,'trust_remote_code':'True',})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:10:29.923623Z","iopub.execute_input":"2025-01-24T11:10:29.923981Z","iopub.status.idle":"2025-01-24T11:11:16.585887Z","shell.execute_reply.started":"2025-01-24T11:10:29.923950Z","shell.execute_reply":"2025-01-24T11:11:16.584859Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"modules.json:   0%|          | 0.00/378 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"b35e467455264dd9b8fb5da09d55ec6c"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"config_sentence_transformers.json:   0%|          | 0.00/464 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f46315b6f1424bf29b6512f95dcd960d"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"README.md:   0%|          | 0.00/734k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"9dd7315b5acf4e2eabd6220dfdd86d3e"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"custom_st.py:   0%|          | 0.00/8.78k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"2cb408bc48f14d5489ec69523491d430"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/jina-embeddings-v3:\n- custom_st.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"config.json:   0%|          | 0.00/1.80k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"b2e67ee7de744488a22187f2b7bc8ee9"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"configuration_xlm_roberta.py:   0%|          | 0.00/6.54k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"1994f2b2440f4c90b70e1bd019106122"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- configuration_xlm_roberta.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"modeling_lora.py:   0%|          | 0.00/15.4k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"a380d61a1d644a7e84f28550ff284030"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"modeling_xlm_roberta.py:   0%|          | 0.00/51.1k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"30c62791a0844b0aa8d89435c01b0a68"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"embedding.py:   0%|          | 0.00/3.88k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"dafa7041d13840eca320b0bd29695c72"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- embedding.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"mha.py:   0%|          | 0.00/34.4k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"46907d3e26a5413aa8facb29785b3d08"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"rotary.py:   0%|          | 0.00/24.5k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"fa976472043f4fcca0fc9ace279a1e55"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- rotary.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\nA new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- mha.py\n- rotary.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"mlp.py:   0%|          | 0.00/7.62k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e8e5642db028403b96e503bd367614e6"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- mlp.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"block.py:   0%|          | 0.00/17.8k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"186d4f9872f745cfa99894b9c606092f"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"stochastic_depth.py:   0%|          | 0.00/3.76k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c54c8df48df742229a4189dad11bf4cd"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- stochastic_depth.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\nA new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- block.py\n- stochastic_depth.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"xlm_padding.py:   0%|          | 0.00/10.0k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"bbc6a5ebb5a64539aedfa8820dff8156"}},"metadata":{}},{"name":"stderr","text":"A new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- xlm_padding.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\nA new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- modeling_xlm_roberta.py\n- embedding.py\n- mha.py\n- mlp.py\n- block.py\n- xlm_padding.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\nA new version of the following files was downloaded from https://huggingface.co/jinaai/xlm-roberta-flash-implementation:\n- modeling_lora.py\n- modeling_xlm_roberta.py\n. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"model.safetensors:   0%|          | 0.00/1.14G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"6257201b12f64448a6a972f65668ec3f"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer_config.json:   0%|          | 0.00/1.15k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"2deed036cd0348e6b5bb78a26148084b"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer.json:   0%|          | 0.00/17.1M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c4c31bda1bfd4b119e8663d89f7d799b"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"special_tokens_map.json:   0%|          | 0.00/964 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5b4926302e7c432fa9f5be4813d6a2a7"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"1_Pooling/config.json:   0%|          | 0.00/192 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"60a219d189ab4dd78dda6a30d7d34411"}},"metadata":{}}],"execution_count":5},{"cell_type":"code","source":"sample_embeddings = embeddings.embed_query(\"Maninder Singh\")\nprint(len(sample_embeddings))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:16.587601Z","iopub.execute_input":"2025-01-24T11:11:16.588458Z","iopub.status.idle":"2025-01-24T11:11:17.024024Z","shell.execute_reply.started":"2025-01-24T11:11:16.588413Z","shell.execute_reply":"2025-01-24T11:11:17.022859Z"}},"outputs":[{"name":"stdout","text":"1024\n","output_type":"stream"}],"execution_count":6},{"cell_type":"code","source":"# test evaluator for embeddgins model\n# lower the value of score more similliar it will be\n\nfrom langchain.evaluation import load_evaluator\n\nhf_evaluator = load_evaluator(\"embedding_distance\",embeddings=embeddings)\n\nhf_evaluator.evaluate_strings(prediction=\"I am comming tomorrow\", reference=\"I will go\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.025525Z","iopub.execute_input":"2025-01-24T11:11:17.025877Z","iopub.status.idle":"2025-01-24T11:11:17.622309Z","shell.execute_reply.started":"2025-01-24T11:11:17.025844Z","shell.execute_reply":"2025-01-24T11:11:17.621284Z"}},"outputs":[{"execution_count":7,"output_type":"execute_result","data":{"text/plain":"{'score': 0.20788975396937748}"},"metadata":{}}],"execution_count":7},{"cell_type":"markdown","source":"## Preparing and saving the Movie Data For Graph RAG","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(\"https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv\", nrows=20)\ndisplay(df.head(3))\n\nprint(df.shape)\nprint(\"=\"*40)\nprint(df.columns)\nprint(\"=\"*40)\nprint(df[\"title\"][:20].values)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.623401Z","iopub.execute_input":"2025-01-24T11:11:17.623836Z","iopub.status.idle":"2025-01-24T11:11:17.896101Z","shell.execute_reply.started":"2025-01-24T11:11:17.623794Z","shell.execute_reply":"2025-01-24T11:11:17.894503Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"   movieId    released             title  \\\n0        1  1995-11-22         Toy Story   \n1        2  1995-12-15           Jumanji   \n2        3  1995-12-22  Grumpier Old Men   \n\n                                              actors       director  \\\n0         Jim Varney|Tim Allen|Tom Hanks|Don Rickles  John Lasseter   \n1  Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...   Joe Johnston   \n2  Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...  Howard Deutch   \n\n                                        genres  imdbRating  \n0  Adventure|Animation|Children|Comedy|Fantasy         8.3  \n1                   Adventure|Children|Fantasy         6.9  \n2                               Comedy|Romance         6.6  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>movieId</th>\n      <th>released</th>\n      <th>title</th>\n      <th>actors</th>\n      <th>director</th>\n      <th>genres</th>\n      <th>imdbRating</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>1995-11-22</td>\n      <td>Toy Story</td>\n      <td>Jim Varney|Tim Allen|Tom Hanks|Don Rickles</td>\n      <td>John Lasseter</td>\n      <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n      <td>8.3</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1995-12-15</td>\n      <td>Jumanji</td>\n      <td>Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...</td>\n      <td>Joe Johnston</td>\n      <td>Adventure|Children|Fantasy</td>\n      <td>6.9</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>1995-12-22</td>\n      <td>Grumpier Old Men</td>\n      <td>Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...</td>\n      <td>Howard Deutch</td>\n      <td>Comedy|Romance</td>\n      <td>6.6</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}},{"name":"stdout","text":"(20, 7)\n========================================\nIndex(['movieId', 'released', 'title', 'actors', 'director', 'genres',\n       'imdbRating'],\n      dtype='object')\n========================================\n['Toy Story' 'Jumanji' 'Grumpier Old Men' 'Waiting to Exhale'\n 'Father of the Bride Part II' 'Heat' 'Sabrina' 'Tom and Huck'\n 'Sudden Death' 'GoldenEye' 'American President, The'\n 'Dracula: Dead and Loving It' 'Balto' 'Nixon' 'Cutthroat Island' 'Casino'\n 'Sense and Sensibility' 'Four Rooms' 'Ace Ventura: When Nature Calls'\n 'Money Train']\n","output_type":"stream"}],"execution_count":8},{"cell_type":"markdown","source":"---\n#### Creating a Detailed Description for Each Movie Row \n---\nBy combining information from various columns, we generate a detailed description of each movie. This step is crucial for enhancing the context and utility of the data, particularly in Retrieval-Augmented Generation (RAG) applications.","metadata":{}},{"cell_type":"code","source":"details = df['title'][0]\ndetails\ndf['movie_detail'] = df.apply(lambda row: f\"Movie {row['title']} is directed by {row['director']}\\\n having actors named {row['actors'].replace('|',' , ')} and it is movie of the \\\ngenre in {row['genres'].replace('|',' , ')}. It has a rating of {row['imdbRating']} \\\nand it is released in {row['released']}\",axis=1)\ndf.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.897399Z","iopub.execute_input":"2025-01-24T11:11:17.897784Z","iopub.status.idle":"2025-01-24T11:11:17.920084Z","shell.execute_reply.started":"2025-01-24T11:11:17.897746Z","shell.execute_reply":"2025-01-24T11:11:17.918779Z"}},"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"   movieId    released                        title  \\\n0        1  1995-11-22                    Toy Story   \n1        2  1995-12-15                      Jumanji   \n2        3  1995-12-22             Grumpier Old Men   \n3        4  1995-12-22            Waiting to Exhale   \n4        5  1995-12-08  Father of the Bride Part II   \n\n                                              actors         director  \\\n0         Jim Varney|Tim Allen|Tom Hanks|Don Rickles    John Lasseter   \n1  Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...     Joe Johnston   \n2  Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...    Howard Deutch   \n3  Whitney Houston|Lela Rochon|Angela Bassett|Lor...  Forest Whitaker   \n4  Steve Martin|Kimberly Williams-Paisley|Diane K...    Charles Shyer   \n\n                                        genres  imdbRating  \\\n0  Adventure|Animation|Children|Comedy|Fantasy         8.3   \n1                   Adventure|Children|Fantasy         6.9   \n2                               Comedy|Romance         6.6   \n3                         Romance|Drama|Comedy         5.6   \n4                                       Comedy         5.9   \n\n                                        movie_detail  \n0  Movie Toy Story is directed by John Lasseter h...  \n1  Movie Jumanji is directed by Joe Johnston havi...  \n2  Movie Grumpier Old Men is directed by Howard D...  \n3  Movie Waiting to Exhale is directed by Forest ...  \n4  Movie Father of the Bride Part II is directed ...  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>movieId</th>\n      <th>released</th>\n      <th>title</th>\n      <th>actors</th>\n      <th>director</th>\n      <th>genres</th>\n      <th>imdbRating</th>\n      <th>movie_detail</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>1995-11-22</td>\n      <td>Toy Story</td>\n      <td>Jim Varney|Tim Allen|Tom Hanks|Don Rickles</td>\n      <td>John Lasseter</td>\n      <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n      <td>8.3</td>\n      <td>Movie Toy Story is directed by John Lasseter h...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1995-12-15</td>\n      <td>Jumanji</td>\n      <td>Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...</td>\n      <td>Joe Johnston</td>\n      <td>Adventure|Children|Fantasy</td>\n      <td>6.9</td>\n      <td>Movie Jumanji is directed by Joe Johnston havi...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>1995-12-22</td>\n      <td>Grumpier Old Men</td>\n      <td>Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...</td>\n      <td>Howard Deutch</td>\n      <td>Comedy|Romance</td>\n      <td>6.6</td>\n      <td>Movie Grumpier Old Men is directed by Howard D...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4</td>\n      <td>1995-12-22</td>\n      <td>Waiting to Exhale</td>\n      <td>Whitney Houston|Lela Rochon|Angela Bassett|Lor...</td>\n      <td>Forest Whitaker</td>\n      <td>Romance|Drama|Comedy</td>\n      <td>5.6</td>\n      <td>Movie Waiting to Exhale is directed by Forest ...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>5</td>\n      <td>1995-12-08</td>\n      <td>Father of the Bride Part II</td>\n      <td>Steve Martin|Kimberly Williams-Paisley|Diane K...</td>\n      <td>Charles Shyer</td>\n      <td>Comedy</td>\n      <td>5.9</td>\n      <td>Movie Father of the Bride Part II is directed ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":9},{"cell_type":"code","source":"df['movie_detail'][0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.922822Z","iopub.execute_input":"2025-01-24T11:11:17.923369Z","iopub.status.idle":"2025-01-24T11:11:17.937489Z","shell.execute_reply.started":"2025-01-24T11:11:17.923328Z","shell.execute_reply":"2025-01-24T11:11:17.936256Z"}},"outputs":[{"execution_count":10,"output_type":"execute_result","data":{"text/plain":"'Movie Toy Story is directed by John Lasseter having actors named Jim Varney , Tim Allen , Tom Hanks , Don Rickles and it is movie of the genre in Adventure , Animation , Children , Comedy , Fantasy. It has a rating of 8.3 and it is released in 1995-11-22'"},"metadata":{}}],"execution_count":10},{"cell_type":"code","source":"# Adding fake data in order to work with GraphRAG\n\nlocation = [\"United States\", \"United States\", \"United States\", \"United States\", \"United States\", \n           \"United States\", \"United States\", \"United States\", \"United States\", \"United Kingdom\", \n           \"United States\", \"United States\", \"United States\", \"United States\", \"Malta\", \n           \"United States\", \"United Kingdom\", \"United States\", \"United States\", \"United States\"]\n\nsimilar_movie = [\"Finding Nemo\", \"Jumanji: Welcome to the Jungle\", \"The Bucket List\", \"The Best Man Holiday\", \"Cheaper by the Dozen\", \n                 \"The Departed\", \"Notting Hill\", \"The Adventures of Huck Finn\", \"Die Hard\", \"Mission Impossible\", \n                 \"Dave\", \"Dead and Loving It: Young Frankenstein\", \"Spirit: Stallion of the Cimarron\", \"JFK\", \"Pirates of the Caribbean: The Curse of the Black Pearl\",\n                 \"Goodfellas\", \"Pride and Prejudice\", \"Pulp Fiction\", \"The Mask\", \"Speed\"\n                 ]\n\ndf[\"similar_movie\"] = similar_movie\n# df[\"tagline\"] = tagline\ndf[\"location\"] = location\ndf.head(3)\n\n# Saving the processed dataset\ndf.to_csv(\"movie.csv\", sep=\",\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.938833Z","iopub.execute_input":"2025-01-24T11:11:17.939467Z","iopub.status.idle":"2025-01-24T11:11:17.964094Z","shell.execute_reply.started":"2025-01-24T11:11:17.939397Z","shell.execute_reply":"2025-01-24T11:11:17.962914Z"}},"outputs":[],"execution_count":11},{"cell_type":"markdown","source":"---\n## Creating Neo4j Graph from the dataset\n---\n\n**Import movie information from the CSV file with tagline, construct the knowledge graph, and store the data in the Graph database**","metadata":{}},{"cell_type":"code","source":"### The following query is to Delete data and empty the Database if anything exists\n\n# graph.query(\"\"\"\n# MATCH (n)\n# DETACH DELETE n\n# \"\"\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:17.965215Z","iopub.execute_input":"2025-01-24T11:11:17.965645Z","iopub.status.idle":"2025-01-24T11:11:17.983213Z","shell.execute_reply.started":"2025-01-24T11:11:17.965602Z","shell.execute_reply":"2025-01-24T11:11:17.982077Z"}},"outputs":[],"execution_count":12},{"cell_type":"markdown","source":"---\nThe following cell is to update the database with the information.\n\n---\n\n1. For this we are loading the dataset processed above from my github account. Actually When I Directly tried loading from directory, I got error for which I had to do `dbms.security.allow_csv_import_from_file_urls=true` but For cloud instance of neo4j i was not able to do it. So I directly used Github Link.\n   <br>\n2. Then loading the dataset and going through each row.\n<br>\n3. For each row creating the Movie node and setting properties as movieID column as ID, title as title, movie_detail column as movie_detail and with IMDB rating. <br>\n4. The director column is split if multiple directors are listed (using | as a delimiter).<br>\n        For each director:<br>\n   * A Person node is created or merged with the director's name as the identifier.\n   * A DIRECTED relationship is created from the Person node to the corresponding Movie node. <br>\n5. Actors:<br>\n    Similar to directors, the actors column is split if multiple actors are listed.\n    For each actor:\n   * A Person node is created or merged with the actor's name as the identifier.\n   * An ACTED_IN relationship is established from the Person node to the Movie node. <br>\n6. Genres:\n    The genres column is split for multiple genres (using | as a delimiter).\n    For each genre:\n    * A Genre node is created or merged with the genre name as the identifier.\n    * An IN_GENRE relationship is created between the Movie node and the Genre node\n    * <br>\n7. Location:\n    * A Location node is created or merged using the location column.\n    * A WAS_TAKEN_IN relationship is established between the Movie node and the Location node.\n <br>\n8. Similar Movies:\n\n    * A SimilarMovies node is created or merged using the similar_movie column.\n    * An IS_SIMILAR_TO relationship is established from the Movie node to the SimilarMovies node.","metadata":{}},{"cell_type":"code","source":"# creating below input value just to make sure not to execute this code again for creating graph accidentaly\nvalue = input(\"Do You realy want to execute this cell and create the GraphDB again ? y/n\")\n\nmovie_csv_path = 'movie.csv'\nif value == 'y':\n    graph.query(\"\"\"\n    LOAD CSV WITH HEADERS FROM \n    'https://raw.githubusercontent.com/manindersingh120996/RAG-Related-Projects/refs/heads/main/movie%20(1).csv'\n    AS row\n    \n    MERGE (m:Movie {id:row.movieId})\n    SET m.released = row.released,\n        m.title = row.title,\n        m.movie_detail = row.movie_detail,\n        m.imdbRating = toFloat(row.imdbRating)\n    \n    FOREACH (director in split(row.director, '|') |\n        MERGE (p:Person {name:trim(director)})\n        MERGE (p)-[:DIRECTED]->(m))\n    \n    FOREACH (actor in split(row.actors, '|') |\n        MERGE (p:Person {name:trim(actor)})\n        MERGE (p)-[:ACTED_IN] ->(m))\n    \n    FOREACH (genre in split(row.genres, '|') |\n        MERGE (g:Genre {name:trim(genre)})\n        MERGE (m)-[:IN_GENRE]->(g))\n    \n    MERGE (l:location {name:trim(row.location)})\n    MERGE (m)-[:WAS_TAKEN_IN]->(l)\n    \n    MERGE (s:SimilarMovies {name:trim(row.similar_movie)})\n    MERGE (m)-[:IS_SIMILAR_TO]->(s)\n    \"\"\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T19:30:13.850237Z","iopub.execute_input":"2025-01-19T19:30:13.850660Z","iopub.status.idle":"2025-01-19T19:30:22.694954Z","shell.execute_reply.started":"2025-01-19T19:30:13.850619Z","shell.execute_reply":"2025-01-19T19:30:22.693730Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"graph.refresh_schema()\nprint(graph.schema)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:42.368061Z","iopub.execute_input":"2025-01-24T11:11:42.369451Z","iopub.status.idle":"2025-01-24T11:11:44.589449Z","shell.execute_reply.started":"2025-01-24T11:11:42.369374Z","shell.execute_reply":"2025-01-24T11:11:44.588076Z"}},"outputs":[{"name":"stdout","text":"Node properties:\nPerson {name: STRING}\nGenre {name: STRING}\nlocation {name: STRING}\nSimilarMovies {name: STRING}\nMovie {id: STRING, released: STRING, title: STRING, imdbRating: FLOAT, movie_detail: STRING, movie_detail_embeddings: LIST}\nRelationship properties:\n\nThe relationships:\n(:Person)-[:DIRECTED]->(:Movie)\n(:Person)-[:ACTED_IN]->(:Movie)\n(:Movie)-[:IN_GENRE]->(:Genre)\n(:Movie)-[:WAS_TAKEN_IN]->(:location)\n(:Movie)-[:IS_SIMILAR_TO]->(:SimilarMovies)\n","output_type":"stream"}],"execution_count":13},{"cell_type":"code","source":"enhanced_graph = Neo4jGraph(enhanced_schema=True,\n                            url=NEO4J_URI,\n    username=NEO4J_USERNAME,\n    password=NEO4J_PASSWORD)\nprint(enhanced_graph.schema)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:44.591035Z","iopub.execute_input":"2025-01-24T11:11:44.591409Z","iopub.status.idle":"2025-01-24T11:11:50.524990Z","shell.execute_reply.started":"2025-01-24T11:11:44.591357Z","shell.execute_reply":"2025-01-24T11:11:50.523532Z"}},"outputs":[{"name":"stdout","text":"Node properties:\n- **Person**\n  - `name`: STRING Example: \"Joe Johnston\"\n- **Genre**\n  - `name`: STRING Example: \"Adventure\"\n- **location**\n  - `name`: STRING Available options: ['United States', 'United Kingdom', 'Malta']\n- **SimilarMovies**\n  - `name`: STRING Example: \"Finding Nemo\"\n- **Movie**\n  - `id`: STRING Example: \"2\"\n  - `released`: STRING Available options: ['1995-12-15', '1995-12-22', '1995-12-08', '1995-11-17', '1996-01-05', '1995-11-22', '1996-01-26', '1995-12-25', '1995-11-10']\n  - `title`: STRING Example: \"Jumanji\"\n  - `imdbRating`: FLOAT Min: 5.6, Max: 8.3\n  - `movie_detail`: STRING Example: \"Movie Jumanji is directed by Joe Johnston having a\"\nRelationship properties:\n\nThe relationships:\n(:Person)-[:DIRECTED]->(:Movie)\n(:Person)-[:ACTED_IN]->(:Movie)\n(:Movie)-[:IN_GENRE]->(:Genre)\n(:Movie)-[:WAS_TAKEN_IN]->(:location)\n(:Movie)-[:IS_SIMILAR_TO]->(:SimilarMovies)\n","output_type":"stream"}],"execution_count":14},{"cell_type":"code","source":"# Match all nodes in the graph\ncypher = \"\"\"\n  MATCH (n)\n  RETURN count(n) as Total_Number_of_Nodes\n  \"\"\"\nresult = graph.query(cypher)\nresult","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:50.527342Z","iopub.execute_input":"2025-01-24T11:11:50.527754Z","iopub.status.idle":"2025-01-24T11:11:50.896045Z","shell.execute_reply.started":"2025-01-24T11:11:50.527698Z","shell.execute_reply":"2025-01-24T11:11:50.894563Z"}},"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"[{'Total_Number_of_Nodes': 155}]"},"metadata":{}}],"execution_count":15},{"cell_type":"markdown","source":"---\n## Creating Vector embedding from the Column of Choice\n---\nIn the following cells I will be creating the Vector embeddings for the Column `Movie Detail` and will store this embeddings corresponding to each rows in `movie_detail_embeddings` column latter which will be used to populate the VECTOR INDEX for `MOVIE Detail` in GraphDB.","metadata":{}},{"cell_type":"code","source":"def embed_text(text:str)->List:\n    \"\"\"\n    Embeds the given text using the specified model.\n\n    Parameters:\n        text (str): The text to be embedded.\n\n    Returns:\n        List: A list containing the embedding of the text.\n    \"\"\"\n    response = embeddings.embed_query(text)\n    \n    return response","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:50.897979Z","iopub.execute_input":"2025-01-24T11:11:50.898401Z","iopub.status.idle":"2025-01-24T11:11:50.904664Z","shell.execute_reply.started":"2025-01-24T11:11:50.898362Z","shell.execute_reply":"2025-01-24T11:11:50.903504Z"}},"outputs":[],"execution_count":16},{"cell_type":"code","source":"df[\"movie_detail\"][:3]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:50.906067Z","iopub.execute_input":"2025-01-24T11:11:50.906502Z","iopub.status.idle":"2025-01-24T11:11:50.928315Z","shell.execute_reply.started":"2025-01-24T11:11:50.906462Z","shell.execute_reply":"2025-01-24T11:11:50.927132Z"}},"outputs":[{"execution_count":17,"output_type":"execute_result","data":{"text/plain":"0    Movie Toy Story is directed by John Lasseter h...\n1    Movie Jumanji is directed by Joe Johnston havi...\n2    Movie Grumpier Old Men is directed by Howard D...\nName: movie_detail, dtype: object"},"metadata":{}}],"execution_count":17},{"cell_type":"code","source":"embedding_list = [embed_text(i) for i in df[\"movie_detail\"]]\nembedding_list\nprint(\"Number of vectors:\", len(embedding_list))\nprint(\"Embedding dimension:\", len(embedding_list[0]))\nembedding_list[0][:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:11:50.929685Z","iopub.execute_input":"2025-01-24T11:11:50.930106Z","iopub.status.idle":"2025-01-24T11:12:01.995641Z","shell.execute_reply.started":"2025-01-24T11:11:50.930074Z","shell.execute_reply":"2025-01-24T11:12:01.994635Z"}},"outputs":[{"name":"stdout","text":"Number of vectors: 20\nEmbedding dimension: 1024\n","output_type":"stream"},{"execution_count":18,"output_type":"execute_result","data":{"text/plain":"[0.039486758410930634,\n -0.09789527952671051,\n 0.12648791074752808,\n 0.19531366229057312,\n 0.06378178298473358]"},"metadata":{}}],"execution_count":18},{"cell_type":"code","source":"df[\"movie_detail_embeddings\"] = embedding_list\ndf.head(3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:01.996806Z","iopub.execute_input":"2025-01-24T11:12:01.997298Z","iopub.status.idle":"2025-01-24T11:12:02.019474Z","shell.execute_reply.started":"2025-01-24T11:12:01.997255Z","shell.execute_reply":"2025-01-24T11:12:02.018273Z"}},"outputs":[{"execution_count":19,"output_type":"execute_result","data":{"text/plain":"   movieId    released             title  \\\n0        1  1995-11-22         Toy Story   \n1        2  1995-12-15           Jumanji   \n2        3  1995-12-22  Grumpier Old Men   \n\n                                              actors       director  \\\n0         Jim Varney|Tim Allen|Tom Hanks|Don Rickles  John Lasseter   \n1  Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...   Joe Johnston   \n2  Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...  Howard Deutch   \n\n                                        genres  imdbRating  \\\n0  Adventure|Animation|Children|Comedy|Fantasy         8.3   \n1                   Adventure|Children|Fantasy         6.9   \n2                               Comedy|Romance         6.6   \n\n                                        movie_detail  \\\n0  Movie Toy Story is directed by John Lasseter h...   \n1  Movie Jumanji is directed by Joe Johnston havi...   \n2  Movie Grumpier Old Men is directed by Howard D...   \n\n                    similar_movie       location  \\\n0                    Finding Nemo  United States   \n1  Jumanji: Welcome to the Jungle  United States   \n2                 The Bucket List  United States   \n\n                             movie_detail_embeddings  \n0  [0.039486758410930634, -0.09789527952671051, 0...  \n1  [0.0078047290444374084, -0.11260329186916351, ...  \n2  [-0.033103544265031815, -0.01669805310666561, ...  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>movieId</th>\n      <th>released</th>\n      <th>title</th>\n      <th>actors</th>\n      <th>director</th>\n      <th>genres</th>\n      <th>imdbRating</th>\n      <th>movie_detail</th>\n      <th>similar_movie</th>\n      <th>location</th>\n      <th>movie_detail_embeddings</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>1995-11-22</td>\n      <td>Toy Story</td>\n      <td>Jim Varney|Tim Allen|Tom Hanks|Don Rickles</td>\n      <td>John Lasseter</td>\n      <td>Adventure|Animation|Children|Comedy|Fantasy</td>\n      <td>8.3</td>\n      <td>Movie Toy Story is directed by John Lasseter h...</td>\n      <td>Finding Nemo</td>\n      <td>United States</td>\n      <td>[0.039486758410930634, -0.09789527952671051, 0...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1995-12-15</td>\n      <td>Jumanji</td>\n      <td>Robin Williams|Bradley Pierce|Kirsten Dunst|Jo...</td>\n      <td>Joe Johnston</td>\n      <td>Adventure|Children|Fantasy</td>\n      <td>6.9</td>\n      <td>Movie Jumanji is directed by Joe Johnston havi...</td>\n      <td>Jumanji: Welcome to the Jungle</td>\n      <td>United States</td>\n      <td>[0.0078047290444374084, -0.11260329186916351, ...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>1995-12-22</td>\n      <td>Grumpier Old Men</td>\n      <td>Walter Matthau|Ann-Margret|Jack Lemmon|Sophia ...</td>\n      <td>Howard Deutch</td>\n      <td>Comedy|Romance</td>\n      <td>6.6</td>\n      <td>Movie Grumpier Old Men is directed by Howard D...</td>\n      <td>The Bucket List</td>\n      <td>United States</td>\n      <td>[-0.033103544265031815, -0.01669805310666561, ...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":19},{"cell_type":"markdown","source":"The query sets up a vector index (`movie_detail_embeddings`) in Neo4j to make similarity searches faster and more effective. It works on the `movie_detail_embeddings` property of `Movie` nodes.\n\n---\n### Why It’s Useful\n---\n- **Semantic Search**: Finds nodes based on meaning, using cosine similarity in a 1024-dimensional space.\n- **How It Helps in GraphRAG**:\n  1. **Context Retrieval**: Finds similar nodes to add useful context for AI models.\n  2. **Scalability**: Handles large datasets quickly and reduces search time.\n  3. **Better Results**: Provides the right context to make AI outputs more accurate and meaningful.\n\nThis combines regular graph search with advanced vector search, making it easier to get meaningful results in GraphRAG workflows.\n\n---\n\n### Steps to Create a Vector Index\n---\n\n1. **Create Embeddings**:\n   - Turn a column from a DataFrame (like `movie_detail`) into vector embeddings.\n   - Save these embeddings in a way that links each vector to its movie.\n\n2. **Set Up the Vector Index**:\n   - Create an empty vector index in the database.\n   - Match the index dimensions (e.g., 1024) to the embedding size from your model.\n\n3. **Add Embeddings to the Index**:\n   - Load the embeddings you made earlier into the index.\n   - Link them to the matching nodes in the graph so they can be searched by similarity.\n\n---\n\n### Challenges\nSetting up a graph database with vector indexing can be tricky. It’s important to prepare and load everything correctly to ensure the database works as expected.","metadata":{}},{"cell_type":"code","source":"# writing this query in case anything goes wrong while setting up vector embeddings in\n# graphDB thus removing Vector Index\n\n# graph.query(\"\"\"\n# DROP INDEX movie_tagline_embeddings\"\"\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:02.021668Z","iopub.execute_input":"2025-01-24T11:12:02.022052Z","iopub.status.idle":"2025-01-24T11:12:02.042090Z","shell.execute_reply.started":"2025-01-24T11:12:02.022017Z","shell.execute_reply":"2025-01-24T11:12:02.040928Z"}},"outputs":[],"execution_count":20},{"cell_type":"code","source":"# here it will create the vector index in the graphDB \n# for now it will be empty\n# creating below input value just to make sure not to execute this code again for creating Vector index again \nvalue = input(\"Do You realy want to execute this cell and create the Vector Index again ? y/n\")\nif value == 'y':\n    graph.query(\"\"\"\n      CREATE VECTOR INDEX movie_detail_embeddings IF NOT EXISTS      // Create a vector index named 'movie_tagline_embeddings' if it doesn't already exist  \n      FOR (m:Movie) ON (m.movie_detail_embeddings)                           // Index the 'taglineEmbedding' property of Movie nodes \n      OPTIONS { indexConfig: {                                        // Set options for the index\n        `vector.dimensions`: 1024,                                    // Specify the dimensionality of the vector space (1024 dimensions)\n        `vector.similarity_function`: 'cosine'                        // Specify the similarity function to be cosine similarity\n      }}\"\"\"\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T19:31:25.531553Z","iopub.execute_input":"2025-01-19T19:31:25.531946Z","iopub.status.idle":"2025-01-19T19:31:28.328022Z","shell.execute_reply.started":"2025-01-19T19:31:25.531915Z","shell.execute_reply":"2025-01-19T19:31:28.326813Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"graph.query(\"\"\"\nSHOW VECTOR INDEXES  // Retrieves information about all the vector indexes in the Database\n\"\"\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:02.043247Z","iopub.execute_input":"2025-01-24T11:12:02.043786Z","iopub.status.idle":"2025-01-24T11:12:02.647958Z","shell.execute_reply.started":"2025-01-24T11:12:02.043741Z","shell.execute_reply":"2025-01-24T11:12:02.646894Z"}},"outputs":[{"execution_count":21,"output_type":"execute_result","data":{"text/plain":"[{'id': 2,\n  'name': 'movie_detail_embeddings',\n  'state': 'ONLINE',\n  'populationPercent': 100.0,\n  'type': 'VECTOR',\n  'entityType': 'NODE',\n  'labelsOrTypes': ['Movie'],\n  'properties': ['movie_detail_embeddings'],\n  'indexProvider': 'vector-2.0',\n  'owningConstraint': None,\n  'lastRead': neo4j.time.DateTime(2025, 1, 20, 13, 4, 44, 703000000, tzinfo=<UTC>),\n  'readCount': 8}]"},"metadata":{}}],"execution_count":21},{"cell_type":"code","source":"# Match all nodes in the graph\ncypher = \"\"\"\n  MATCH (m:Movies)\n  RETURN m.movie_detail_embeddings LIMIT 1\n  \"\"\"\nresult = graph.query(cypher)\nresult","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:07.488778Z","iopub.execute_input":"2025-01-24T11:12:07.489153Z","iopub.status.idle":"2025-01-24T11:12:07.865513Z","shell.execute_reply.started":"2025-01-24T11:12:07.489123Z","shell.execute_reply":"2025-01-24T11:12:07.864538Z"}},"outputs":[{"execution_count":22,"output_type":"execute_result","data":{"text/plain":"[]"},"metadata":{}}],"execution_count":22},{"cell_type":"code","source":"# Populating the Vector Indexes in the Database with Vector Embedding Values\n# Creating the input value below as a safeguard to prevent accidental re-execution of this code, \n# which could recreate the graph unintentionally.\n\nvalue = input(\"Do You realy want to execute this cell and populate the Vector index again ? y/n\")\nif value == 'y':\n    for index, row in df.iterrows():\n        movie_id = row['movieId']\n        embedding = row['movie_detail_embeddings']\n        graph.query(f\"MATCH (m:Movie {{id: '{movie_id}'}}) SET m.movie_detail_embeddings = {embedding}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-19T19:31:49.215996Z","iopub.execute_input":"2025-01-19T19:31:49.216418Z","iopub.status.idle":"2025-01-19T19:32:01.271333Z","shell.execute_reply.started":"2025-01-19T19:31:49.216385Z","shell.execute_reply":"2025-01-19T19:32:01.270043Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"graph.refresh_schema()\nprint(graph.schema)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:12.476488Z","iopub.execute_input":"2025-01-24T11:12:12.476927Z","iopub.status.idle":"2025-01-24T11:12:14.560788Z","shell.execute_reply.started":"2025-01-24T11:12:12.476887Z","shell.execute_reply":"2025-01-24T11:12:14.559561Z"}},"outputs":[{"name":"stdout","text":"Node properties:\nPerson {name: STRING}\nGenre {name: STRING}\nlocation {name: STRING}\nSimilarMovies {name: STRING}\nMovie {id: STRING, released: STRING, title: STRING, imdbRating: FLOAT, movie_detail: STRING, movie_detail_embeddings: LIST}\nRelationship properties:\n\nThe relationships:\n(:Person)-[:DIRECTED]->(:Movie)\n(:Person)-[:ACTED_IN]->(:Movie)\n(:Movie)-[:IN_GENRE]->(:Genre)\n(:Movie)-[:WAS_TAKEN_IN]->(:location)\n(:Movie)-[:IS_SIMILAR_TO]->(:SimilarMovies)\n","output_type":"stream"}],"execution_count":23},{"cell_type":"code","source":"# testing the embedding by printing the result from the database\nresult = graph.query(\"\"\"\n    MATCH (m:Movie)\n    WHERE m.movie_detail IS NOT NULL\n    RETURN m.movie_detail, m.movie_detail_embeddings\n    LIMIT 1\n\"\"\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:18.384265Z","iopub.execute_input":"2025-01-24T11:12:18.384626Z","iopub.status.idle":"2025-01-24T11:12:18.888247Z","shell.execute_reply.started":"2025-01-24T11:12:18.384597Z","shell.execute_reply":"2025-01-24T11:12:18.886966Z"}},"outputs":[],"execution_count":24},{"cell_type":"code","source":"result[0]['m.movie_detail'],len(result[0]['m.movie_detail_embeddings'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:19.504847Z","iopub.execute_input":"2025-01-24T11:12:19.505189Z","iopub.status.idle":"2025-01-24T11:12:19.511651Z","shell.execute_reply.started":"2025-01-24T11:12:19.505161Z","shell.execute_reply":"2025-01-24T11:12:19.510783Z"}},"outputs":[{"execution_count":25,"output_type":"execute_result","data":{"text/plain":"('Movie Jumanji is directed by Joe Johnston having actors named Robin Williams , Bradley Pierce , Kirsten Dunst , Jonathan Hyde and it is movie of the genre in Adventure , Children , Fantasy. It has a rating of 6.9 and it is released in 1995-12-15',\n 1024)"},"metadata":{}}],"execution_count":25},{"cell_type":"markdown","source":"---\n## QnA with GraphDB with GraphCypherQAChain and Then Making It more Robust towards fetching the relevant data. \n\n---\n> **NOTE:** It is also possible to just Retrive the data using Cypher query only from the database and then feeding answer retrived along with question to LLM to generate the answer.","metadata":{}},{"cell_type":"code","source":"q_one = \"What was the cast of the Casino?\"\nq_two = \"What are the most common genres for movies released in 1995?\"\nq_three = \"What are the similar movies to the ones that Tom Hanks acted in?\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:27.497378Z","iopub.execute_input":"2025-01-24T11:12:27.497825Z","iopub.status.idle":"2025-01-24T11:12:27.502784Z","shell.execute_reply.started":"2025-01-24T11:12:27.497794Z","shell.execute_reply":"2025-01-24T11:12:27.501628Z"}},"outputs":[],"execution_count":26},{"cell_type":"markdown","source":"---\n### First let's play with Simple Agent which converts our question to Cypher query which thus retrives the relevant answer and then along with question feeds it to LLM for answer generation\n\n---\n> `CypherQAChain` is the first step in making it easy to ask questions to a GraphDB. It converts natural language questions into Cypher queries, so you can quickly get information from the database without needing to know Cypher coding.<br>\n<br>\n> While it works well for simple questions, it might struggle with more complex ones. That’s where the next step comes in—adding more layers of processing to handle tricky queries and provide even better answers!\n>\n\nMake Sure to Use LLMs for all the tasks here which are good at understanding and Creating CYpherQuery Langauge\n","metadata":{}},{"cell_type":"code","source":"from langchain.chains import GraphCypherQAChain\n# this we can call as the simple agent because here \n# we are running only two lines\n# but it is not that powerfull as we will see for question 2 and question 3\n# where question becomes more complicated\n\n\"\"\"\nOne way to improve this process is by using a more powerful language model\ncapable of generating accurate Cypher queries. For instance, \nI initially used LLaMA 3.1 (8B), which struggled to answer two specific questions.\nHowever, upgrading to LLaMA 3.3 (70B) successfully resolved the 1st and 3rd questions.\n\"\"\"\ncypher_execution_chain = GraphCypherQAChain.from_llm(graph=graph,  # here it retrives the graph Schema\n                                    llm=llm_model,\n                                    verbose=True,\n                                    allow_dangerous_requests=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:29.165353Z","iopub.execute_input":"2025-01-24T11:12:29.165803Z","iopub.status.idle":"2025-01-24T11:12:29.206940Z","shell.execute_reply.started":"2025-01-24T11:12:29.165765Z","shell.execute_reply":"2025-01-24T11:12:29.205753Z"}},"outputs":[],"execution_count":27},{"cell_type":"code","source":"response = cypher_execution_chain.invoke({\"query\": q_one})\nprint(response)\nprint(\"\\nLLM response:\", response[\"result\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:30.064829Z","iopub.execute_input":"2025-01-24T11:12:30.065221Z","iopub.status.idle":"2025-01-24T11:12:31.463307Z","shell.execute_reply.started":"2025-01-24T11:12:30.065180Z","shell.execute_reply":"2025-01-24T11:12:31.462218Z"}},"outputs":[{"name":"stdout","text":"\n\n\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\nGenerated Cypher:\n\u001b[32;1m\u001b[1;3mMATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title = \"Casino\" RETURN p.name\u001b[0m\nFull Context:\n\u001b[32;1m\u001b[1;3m[{'p.name': 'Robert De Niro'}, {'p.name': 'Joe Pesci'}, {'p.name': 'Sharon Stone'}, {'p.name': 'James Woods'}]\u001b[0m\n\n\u001b[1m> Finished chain.\u001b[0m\n{'query': 'What was the cast of the Casino?', 'result': 'The cast of Casino included Robert De Niro, Joe Pesci, Sharon Stone, and James Woods.'}\n\nLLM response: The cast of Casino included Robert De Niro, Joe Pesci, Sharon Stone, and James Woods.\n","output_type":"stream"}],"execution_count":28},{"cell_type":"code","source":"response = cypher_execution_chain.invoke({\"query\": q_two})\nprint(response)\nprint(\"\\nLLM response:\", response[\"result\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:31.464620Z","iopub.execute_input":"2025-01-24T11:12:31.464959Z","iopub.status.idle":"2025-01-24T11:12:33.442845Z","shell.execute_reply.started":"2025-01-24T11:12:31.464928Z","shell.execute_reply":"2025-01-24T11:12:33.441759Z"}},"outputs":[{"name":"stdout","text":"\n\n\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\nGenerated Cypher:\n\u001b[32;1m\u001b[1;3mMATCH (m:Movie)-[:IN_GENRE]->(g:Genre) \nWHERE m.released = \"1995\" \nRETURN g.name, COUNT(m) AS count \nORDER BY count DESC\u001b[0m\nFull Context:\n\u001b[32;1m\u001b[1;3m[]\u001b[0m\n\n\u001b[1m> Finished chain.\u001b[0m\n{'query': 'What are the most common genres for movies released in 1995?', 'result': \"I don't know the answer.\"}\n\nLLM response: I don't know the answer.\n","output_type":"stream"}],"execution_count":29},{"cell_type":"code","source":"response = cypher_execution_chain.invoke({\"query\": q_three})\nprint(response)\nprint(\"\\nLLM response:\", response[\"result\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:33.444292Z","iopub.execute_input":"2025-01-24T11:12:33.444615Z","iopub.status.idle":"2025-01-24T11:12:34.482968Z","shell.execute_reply.started":"2025-01-24T11:12:33.444589Z","shell.execute_reply":"2025-01-24T11:12:34.481746Z"}},"outputs":[{"name":"stdout","text":"\n\n\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\nGenerated Cypher:\n\u001b[32;1m\u001b[1;3mMATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie)-[:IS_SIMILAR_TO]->(sm:SimilarMovies) RETURN sm.name\u001b[0m\nFull Context:\n\u001b[32;1m\u001b[1;3m[{'sm.name': 'Finding Nemo'}]\u001b[0m\n\n\u001b[1m> Finished chain.\u001b[0m\n{'query': 'What are the similar movies to the ones that Tom Hanks acted in?', 'result': 'Finding Nemo is a similar movie.'}\n\nLLM response: Finding Nemo is a similar movie.\n","output_type":"stream"}],"execution_count":30},{"cell_type":"code","source":"response = cypher_execution_chain.invoke({\"query\": \"which movie did Powers Boothe act in?\"})\nprint(response)\nprint(\"\\nLLM response:\", response[\"result\"])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:37.104584Z","iopub.execute_input":"2025-01-24T11:12:37.105006Z","iopub.status.idle":"2025-01-24T11:12:38.387011Z","shell.execute_reply.started":"2025-01-24T11:12:37.104971Z","shell.execute_reply":"2025-01-24T11:12:38.385850Z"}},"outputs":[{"name":"stdout","text":"\n\n\u001b[1m> Entering new GraphCypherQAChain chain...\u001b[0m\nGenerated Cypher:\n\u001b[32;1m\u001b[1;3mMATCH (p:Person {name: 'Powers Boothe'})-[:ACTED_IN]->(m:Movie) RETURN m.title\u001b[0m\nFull Context:\n\u001b[32;1m\u001b[1;3m[{'m.title': 'Sudden Death'}, {'m.title': 'Nixon'}]\u001b[0m\n\n\u001b[1m> Finished chain.\u001b[0m\n{'query': 'which movie did Powers Boothe act in?', 'result': 'Powers Boothe acted in Sudden Death and Nixon.'}\n\nLLM response: Powers Boothe acted in Sudden Death and Nixon.\n","output_type":"stream"}],"execution_count":31},{"cell_type":"markdown","source":"---\n### Enhancing CypherQAChain for More Accurate and Context-Aware Queries\n---\nWhile the CypherQAChain provides a solid foundation for querying a graph database using natural language, it can be further enhanced to deliver more precise and context-aware results. The next stage of improvement involves introducing a robust pipeline to understand user inputs better and generate tailored Cypher queries accordingly. This approach ensures that the system accounts for both the graph schema and the specific values stored in the database.\n\n---\n### Steps to Improve CypherQAChain with Entity Mapping and Context-Aware Querying\n---\n1. **Detecting Entities in User Input**  \n   Extract key entities and values from the user query, such as movie titles, directors, actors, and genres.\n\n2. **Mapping Entities to the Database**  \n   Match the extracted entities to actual values stored in the database, ensuring accurate alignment between the user query and the database content.\n\n3. **Defining a Custom Cypher Prompt**  \n   Create a specialized Cypher prompt that combines the schema, entity mappings, and user query. This step generates a Cypher query tailored to the context.\n\n4. **Generating Answers Based on Database Results**  \n   Execute the generated Cypher query to retrieve relevant information from the database and use it to provide a well-informed answer to the user.\n\n---\n\n### Strategies for Improved Query Generation\n\n---\nOne limitation of built-in graph chains is that while the language model understands the graph schema, it lacks knowledge of the actual property values stored in the database. To address this, we introduce a mapping layer to bridge the gap between user inputs and database values. \n\n### Benefits of Entity Detection and Mapping\n\n- **Precision**: By explicitly mapping entities, we reduce ambiguity and ensure the generated queries align closely with the database.  \n- **Context Awareness**: Incorporating both the schema and entity values allows the system to produce more relevant and targeted Cypher queries.  \n- **Enhanced Answers**: Using this multi-step process, the retrieved database results are more accurate and contextually relevant, improving the final output's quality.\n\n","metadata":{}},{"cell_type":"code","source":"from typing import List\n\n# from langchain.chains.openai_functions import create_structured_output_chain\nfrom langchain.chains import create_structured_output_runnable\nfrom langchain_core.prompts import ChatPromptTemplate\n# from langchain_core.pydantic_v1 import BaseModel, Field\n\nfrom pydantic import BaseModel, Field, field_validator\nclass Entities(BaseModel):\n    \"\"\"Identifying information about entities and \n    extract person, movies, and years entitites from the text.\"\"\"\n\n    names: List[str] = Field(\n        ...,\n        description=\"All the person , year or movies appearing in the text\",\n    )\n\n\n\nentity_extractor_model = llm_model.with_structured_output(Entities)\n\n# entity_chain = create_structured_output_runnable(Person, llm_model, prompt)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:43.177018Z","iopub.execute_input":"2025-01-24T11:12:43.177362Z","iopub.status.idle":"2025-01-24T11:12:43.204035Z","shell.execute_reply.started":"2025-01-24T11:12:43.177333Z","shell.execute_reply":"2025-01-24T11:12:43.202942Z"}},"outputs":[],"execution_count":32},{"cell_type":"code","source":"entity_extractor_model.invoke('Hello my name is maninder.I am born in 1996 and my fav movie is Interstellar')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:44.228672Z","iopub.execute_input":"2025-01-24T11:12:44.229111Z","iopub.status.idle":"2025-01-24T11:12:44.695644Z","shell.execute_reply.started":"2025-01-24T11:12:44.229077Z","shell.execute_reply":"2025-01-24T11:12:44.694623Z"}},"outputs":[{"execution_count":33,"output_type":"execute_result","data":{"text/plain":"Entities(names=['maninder', '1996', 'Interstellar'])"},"metadata":{}}],"execution_count":33},{"cell_type":"code","source":"entities_q_two = entity_extractor_model.invoke(q_two)\nprint(entities_q_two)\nentities_q_three = entity_extractor_model.invoke(q_three)\nprint(entities_q_three)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:46.557077Z","iopub.execute_input":"2025-01-24T11:12:46.557825Z","iopub.status.idle":"2025-01-24T11:12:47.486608Z","shell.execute_reply.started":"2025-01-24T11:12:46.557783Z","shell.execute_reply":"2025-01-24T11:12:47.485646Z"}},"outputs":[{"name":"stdout","text":"names=['1995', 'movies']\nnames=['Tom Hanks', 'Forrest Gump', 'Cast Away', '1994', '2000']\n","output_type":"stream"}],"execution_count":34},{"cell_type":"markdown","source":"---\nUtilizing a simple CONTAINS clause to match entities to database. In practice, you might want to use a fuzzy search or a fulltext index to allow for minor misspellings.\n\n---","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:e1c7ebdc-08b5-4329-bda1-9a7d2b67d44f.png)\n\nThe provided code is a Cypher query designed to retrieve and structure detailed information about nodes and their relationships in a graph database. \nThis query extracts information about Movie or Person nodes in the graph database and their relationships (ACTED_IN, IN_GENRE) to provide a detailed, human-readable summary of the node and its context. It aligns with the second stage of improvement, where the goal is to create more context-aware responses based on entity mappings and relationships.\n\n---\n\n### Context of Use\n---\nIn the second stage of enhancing CypherQAChain, this query aligns with the goal of providing detailed, context-rich answers by:\n\n1. Placing the extracted entities (Movie, Person) extracted using `Entities` in user inputs via $value.\n2. Mapping relationships and connected nodes to present relevant details.\n3. Generating a structured summary for each matched node, improving the answer's depth and clarity.","metadata":{},"attachments":{"e1c7ebdc-08b5-4329-bda1-9a7d2b67d44f.png":{"image/png":"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/BxOn/DBHxiD20zaLHKi+i9dWLQwL7zvCJ7Fr8S2nXp9AF0zkb6XEnkr5/zrccNN+cpdqn57xoehsbOY9A2ayAfiWNxTCteXrkd++DjPbF6yO1ai1OVAQV4BckJF4pwfvxj7BYbch3DIm4mGoXo70JJb8mG3T23HjJfLS9208tJFRuxL+ZeX4YZcO67Nnz817UTmPf8ETr85CPdr3ulfAaXRTy8Lvt2JW2tM3gEr0RQcg3g3o7E+3bS6qrggb6pOvITitazTFy8sRPEXc3C5eP7RmAfvnAngV0c8GFbfkoBRfFXr0bERNwa6zXzGRUY/TSli6nNsrM/gvsq1Yb4SXc+kpZzMeH07Q2lkGO/OYWJ4Av6xQQy+dgnGcCIi+lSZkcEYIiL6lMmtR/cLZRELL1tcADpD66EQTVuCwRgiIiKiVKU0TYmIiD7d7NWO6DtgTbyDnmnciYuIiIiI6NOEgzFERGSRAxu+FH13Gb+v3+BW+kREREREZISDMUREZM1NZVicqz2WLozAs8erPSEiIiIiomQ4GENERJaUVtwAu/ZYcdr3ybudPhERERFRGnEwhoiILFiJksJs7bEUhG+wfcbu0ERERERE9GnAwRgiIjJv7QoUR47FBHx4Y5/2mIiIiIiITOFgDBERmVb954WwaY+lSZ+bt/glIiIiIrKIgzFERGRSGRbO8WP09Jj248XLvQPa3yz6IPJz1B9OdaKLkj86n46+68f72p+IiIiIUvV7CxZc85/aYyIiIiIiIiIiSjNeGUNERERERERElEEcjCEiIiIiIiIiyiAOxhARERERERERZRAHY4iIiIiIiIiIMoiDMUREREREREREGcTBGCIiIiIiIiKiDOJgDBERERERERFRBnEwhoiIiIiIiIgogzgYQ0RERERERESUQRyMISIiIiIiIiLKIA7GEBERERERERFlEAdjiIiIiIiIiIgyiIMxREREREREREQZxMEYIiIiIiIiIqIM4mAMEREREREREVEGcTCGiIiIiIiIiCiDOBhDRERERERERJRBHIwhIiIiIiIiIsogDsYQEREREREREWUQB2OIiIiIiIiIiDKIgzFERERERERERBnEwRgiIiIiIiIiogziYAwRERERERERUQZxMIaIiIiIiIiIKIM4GENERERERERElEEcjCEiIiIiIiIiyiAOxhARERERERERZRAH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o/uFMhR+JDqEdydofM44K+UrlFZBTPpSXE8glB+T5HNLeZxipLs8mo3/Vo9jJmKtKfI2uUXy1sjm8rrp+C3yf8l/GZ3FfTMf0+OxkrfM5pOZcNHknRCTsS5WvPrK2rEr/dZhNC3JxvCBMlRFrhdjZFpttMSsxYBU23vTz9dJhWJCmmJqOvOv6fhERESzxvJgDNFs0A/GXNLCHT7R+P7rv0Hpoiz43XVYtWW6U/CIiOjTJtTpviLPhcoKJ+wXfNh9W02apgsTERHRTOFgDF0SPlGDMRUdePUheZcmVWCkH1vua4+aCkFERGSGWj9qT4KT8OxZh82cjkJERHTR42AMXRLUM3/TmCZzUZm6JJuXDxMR0XSEp5CZnF5HREREFwcOxhARERERERERZZC5uykREREREREREdGM4GAMEREREREREVEGcTCGiIiIiIiIiCiDOBhDRERERERERJRBHIwhIiIiIiIiIsogDsYQEREREREREWUQB2OIiIiIiIiIiDKIgzFERERERERERBnEwRgiIiIiIiIiogziYAwRERERERERUQZxMIaIiIiIiIiIKIM4GENERERERERElEEcjCEiIiIiIiIiyiAOxhARERERERERZRAHY4iIiIiIiIiIMoiDMUREREREREREGcTBGCIiIiIiIiKiDOJgDBERERERERFRBnEwhoiIiIiIiIgogzgYQ0RERERERESUQRyMISIiIiIiIiLKIA7GEBERERERERFlEAdjiIiIiIiIiIgyiIMxREREREREREQZxMEYIiIiIiIiIqIM4mAMEREREREREVEGcTCGiIiIiIiIiCiDOBhDRERERERERJRBHIwhIiIiIiIiIsogDsYQEREREREREWUQB2OIiIiIiIiIiDKIgzFERERERERERBnEwRgiIiIiIiIiogziYAwRERERERERUQZxMIaIiIiIiIiIKIM4GENERERERERElEEcjCEiIiIiIiIiyiAOxhARERERERERZRAHY4iIiIiIiIiIMoiDMUREREREREREGcTBGCIiIiIiIiKiDOJgDBERERERERFRBnEwhoiIiIiIiIgogzgYQ0RERERERESUQRyMISIiIiIiIiLKoN9bsOCa/9Qexyh9sBnFV2tPEjqHU0fa0XOiHt2vr0T+h0PY+ZUG9Gl/Tb8cFK+pROl189SnZ7zY8tyA+viitxIb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"}}},{"cell_type":"code","source":"\nmatch_query = \"\"\"\nMATCH (m:Movie|Person)\nWHERE m.title CONTAINS $value OR m.name CONTAINS $value OR m.released CONTAINS $value\nMATCH (m)-[r:ACTED_IN|IN_GENRE]-(t)\nWITH m, type(r) as type, collect(coalesce(t.name, t.title)) as names\nWITH m, type+\": \"+reduce(s=\"\", n IN names | s + n + \", \") as types\nWITH m, collect(types) as contexts\nWITH m, \"type:\" + labels(m)[0] + \"\\ntitle: \"+ coalesce(m.title, m.name) \n       + \"\\nyear: \"+coalesce(m.released,\"\") +\"\\n\" +\n       reduce(s=\"\", c in contexts | s + substring(c, 0, size(c)-2) +\"\\n\") as result\nRETURN result\n\"\"\"\n\ndef map_to_database(values)->str:\n    \"\"\"\n    Maps the values to entities in the database and returns the mapping information.\n\n    Args:\n        values (list): A list of values to map to entities in the database.\n\n    Returns:\n        str: A string containing the mapping information of each value to entities in the \n    \"\"\"\n    result = \"\"\n    for entity in values.names:\n        response = graph.query(match_query, {\"value\": entity})\n        # print(response)\n        try:\n            for values in response:\n                result += f\"{entity} maps to {values['result']}  in database\\n\\n\" # Query the database to find the mapping for the entity\n        except IndexError:\n            pass\n    return result","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:49.542681Z","iopub.execute_input":"2025-01-24T11:12:49.543089Z","iopub.status.idle":"2025-01-24T11:12:49.549625Z","shell.execute_reply.started":"2025-01-24T11:12:49.543056Z","shell.execute_reply":"2025-01-24T11:12:49.548277Z"}},"outputs":[],"execution_count":35},{"cell_type":"code","source":"entities_q_three","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:51.044749Z","iopub.execute_input":"2025-01-24T11:12:51.045119Z","iopub.status.idle":"2025-01-24T11:12:51.051971Z","shell.execute_reply.started":"2025-01-24T11:12:51.045082Z","shell.execute_reply":"2025-01-24T11:12:51.050636Z"}},"outputs":[{"execution_count":36,"output_type":"execute_result","data":{"text/plain":"Entities(names=['Tom Hanks', 'Forrest Gump', 'Cast Away', '1994', '2000'])"},"metadata":{}}],"execution_count":36},{"cell_type":"code","source":"print(\"2:\", map_to_database(entities_q_two))\nprint(\"3:\", map_to_database(entities_q_three))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:12:51.892496Z","iopub.execute_input":"2025-01-24T11:12:51.892912Z","iopub.status.idle":"2025-01-24T11:12:55.015778Z","shell.execute_reply.started":"2025-01-24T11:12:51.892874Z","shell.execute_reply":"2025-01-24T11:12:55.014572Z"}},"outputs":[{"name":"stdout","text":"2: 1995 maps to type:Movie\ntitle: Jumanji\nyear: 1995-12-15\nACTED_IN: Robin Williams, Bradley Pierce, Kirsten Dunst, Jonathan Hyde\nIN_GENRE: Adventure, Children, Fantasy\n  in database\n\n1995 maps to type:Movie\ntitle: Grumpier Old Men\nyear: 1995-12-22\nACTED_IN: Walter Matthau, Ann-Margret, Jack Lemmon, Sophia Loren\nIN_GENRE: Comedy, Romance\n  in database\n\n1995 maps to type:Movie\ntitle: Waiting to Exhale\nyear: 1995-12-22\nACTED_IN: Whitney Houston, Lela Rochon, Angela Bassett, Loretta Devine\nIN_GENRE: Comedy, Romance, Drama\n  in database\n\n1995 maps to type:Movie\ntitle: Father of the Bride Part II\nyear: 1995-12-08\nACTED_IN: Steve Martin, Kimberly Williams-Paisley, Diane Keaton, Martin Short\nIN_GENRE: Comedy\n  in database\n\n1995 maps to type:Movie\ntitle: Heat\nyear: 1995-12-15\nACTED_IN: Al Pacino, Robert De Niro, Val Kilmer, Jon Voight\nIN_GENRE: Action, Crime, Thriller\n  in database\n\n1995 maps to type:Movie\ntitle: Sabrina\nyear: 1995-12-15\nACTED_IN: Julia Ormond, Harrison Ford, Nancy Marchand, Greg Kinnear\nIN_GENRE: Comedy, Romance\n  in database\n\n1995 maps to type:Movie\ntitle: Tom and Huck\nyear: 1995-12-22\nACTED_IN: Jonathan Taylor Thomas, Brad Renfro, Eric Schweig, Charles Rocket\nIN_GENRE: Adventure, Children\n  in database\n\n1995 maps to type:Movie\ntitle: Sudden Death\nyear: 1995-12-22\nACTED_IN: Jean-Claude Van Damme, Powers Boothe, Raymond J. Barry, Whittni Wright\nIN_GENRE: Action\n  in database\n\n1995 maps to type:Movie\ntitle: GoldenEye\nyear: 1995-11-17\nACTED_IN: Pierce Brosnan, Famke Janssen, Sean Bean, Izabella Scorupco\nIN_GENRE: Adventure, Action, Thriller\n  in database\n\n1995 maps to type:Movie\ntitle: American President, The\nyear: 1995-11-17\nACTED_IN: Martin Sheen, Michael J. Fox, Michael Douglas, Annette Bening\nIN_GENRE: Comedy, Romance, Drama\n  in database\n\n1995 maps to type:Movie\ntitle: Dracula: Dead and Loving It\nyear: 1995-12-22\nACTED_IN: Peter MacNicol, Leslie Nielsen, Steven Weber, Amy Yasbeck\nIN_GENRE: Comedy, Horror\n  in database\n\n1995 maps to type:Movie\ntitle: Balto\nyear: 1995-12-22\nACTED_IN: Kevin Bacon, Bob Hoskins, Jim Cummings, Bridget Fonda\nIN_GENRE: Adventure, Animation, Children\n  in database\n\n1995 maps to type:Movie\ntitle: Cutthroat Island\nyear: 1995-12-22\nACTED_IN: Geena Davis, Frank Langella, Matthew Modine, Maury Chaykin\nIN_GENRE: Adventure, Romance, Action\n  in database\n\n1995 maps to type:Movie\ntitle: Casino\nyear: 1995-11-22\nACTED_IN: Robert De Niro, Joe Pesci, Sharon Stone, James Woods\nIN_GENRE: Drama, Crime\n  in database\n\n1995 maps to type:Movie\ntitle: Four Rooms\nyear: 1995-12-25\nACTED_IN: Amanda De Cadenet, Valeria Golino, Madonna, Sammi Davis\nIN_GENRE: Comedy\n  in database\n\n1995 maps to type:Movie\ntitle: Ace Ventura: When Nature Calls\nyear: 1995-11-10\nACTED_IN: Jim Carrey, Ian McNeice, Simon Callow, Maynard Eziashi\nIN_GENRE: Comedy\n  in database\n\n1995 maps to type:Movie\ntitle: Money Train\nyear: 1995-11-22\nACTED_IN: Wesley Snipes, Robert Blake, Woody Harrelson, Jennifer Lopez\nIN_GENRE: Comedy, Drama, Action, Crime, Thriller\n  in database\n\n1995 maps to type:Movie\ntitle: Toy Story\nyear: 1995-11-22\nACTED_IN: Jim Varney, Tim Allen, Tom Hanks, Don Rickles\nIN_GENRE: Adventure, Animation, Children, Comedy, Fantasy\n  in database\n\n\n3: Tom Hanks maps to type:Person\ntitle: Tom Hanks\nyear: \nACTED_IN: Toy Story\n  in database\n\n\n","output_type":"stream"}],"execution_count":37},{"cell_type":"code","source":"from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.runnables import RunnablePassthrough\n\n# Generate Cypher statement based on natural language input\ncypher_template = \"\"\"Based on the Neo4j graph schema below, write a Cypher query that would answer the user's question:\n{schema}\nEntities in the question map to the following database values:\n{entities_list}\nQuestion: {question}\nNote: Do not include any explanations or apologies in your responses.\nDo not wrap the response in any backticks or anything else.\nRespond with a Cypher statement only!\nCypher query:\"\"\"  # noqa: E501\n\ncypher_prompt = ChatPromptTemplate.from_messages(\n    [\n        (\n            \"system\",\n            \"Given an input question, convert it to a Cypher query. No pre-amble.\",\n        ),\n        (\"human\", cypher_template),\n    ]\n)\n# cypher_prompt.invoke({'schema'})\n\nchain = cypher_prompt | llm_model.bind(stop=[\"\\nCypherResult:\"]) | StrOutputParser()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:36.910968Z","iopub.execute_input":"2025-01-24T11:13:36.911349Z","iopub.status.idle":"2025-01-24T11:13:36.918682Z","shell.execute_reply.started":"2025-01-24T11:13:36.911304Z","shell.execute_reply":"2025-01-24T11:13:36.916975Z"}},"outputs":[],"execution_count":38},{"cell_type":"markdown","source":"### Generating answers based on database results\n\n---\nNow that we have a chain that generates the Cypher statement, we need to execute the Cypher statement against the database and send the database results back to an LLM to generate the final answer.","metadata":{}},{"cell_type":"code","source":"from langchain.chains.graph_qa.cypher_utils import CypherQueryCorrector, Schema\n\n# Cypher validation tool for relationship directions\ncorrector_schema = [\n    Schema(el[\"start\"], el[\"type\"], el[\"end\"])\n    for el in graph.structured_schema.get(\"relationships\")\n]\ncypher_validation = CypherQueryCorrector(corrector_schema)\n\n# Generate natural language response based on database results\nresponse_template = \"\"\"Based on the the question, Cypher query, and Cypher response, write a natural language response:\nQuestion: {question}\nCypher query: {query}\nCypher Response: {response}\"\"\"\n\nresponse_prompt = ChatPromptTemplate.from_messages(\n    [\n        (\n            \"system\",\n            \"Given an input question and Cypher response, convert it to a natural\"\n            \" language answer.Give the answer in Structured format such a Visually appealing to Read to user.\"\n            \n            \"No pre-amble.\",\n        ),\n        (\"human\", response_template),\n    ]\n)\n\nchain_2 = response_prompt | llm_model | StrOutputParser()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:39.406546Z","iopub.execute_input":"2025-01-24T11:13:39.406955Z","iopub.status.idle":"2025-01-24T11:13:39.416524Z","shell.execute_reply.started":"2025-01-24T11:13:39.406920Z","shell.execute_reply":"2025-01-24T11:13:39.415093Z"}},"outputs":[{"name":"stderr","text":"<ipython-input-39-eb8b073ea675>:8: LangChainDeprecationWarning: The class `CypherQueryCorrector` was deprecated in LangChain 0.3.8 and will be removed in 1.0. An updated version of the class exists in the :class:`~langchain-neo4j package and should be used instead. To use it run `pip install -U :class:`~langchain-neo4j` and import as `from :class:`~langchain_neo4j.chains.graph_qa.cypher_utils import CypherQueryCorrector``.\n  cypher_validation = CypherQueryCorrector(corrector_schema)\n","output_type":"stream"}],"execution_count":39},{"cell_type":"code","source":"from IPython.display import Markdown as md\ndef questions_asked(question_asked:str):\n    question = question_asked\n    entities = entity_extractor_model.invoke(question)\n    entities_list = map_to_database(entities)\n    schema = graph.get_schema\n    chain = cypher_prompt | llm_model.bind(stop=[\"\\nCypherResult:\"]) | StrOutputParser()\n    cypher_query = chain.invoke({'schema': schema,\n                 'entities_list': entities_list,\n                 'question': question})\n    \n    print(f\"Cypher Query Generated : {cypher_query}\")\n    print(\"=\"*40)\n    graph.query(cypher_query)\n    \n    final_answer = chain_2.invoke({'response': graph.query(cypher_query),\n                 'query': cypher_query,\n                 'question': question})\n    \n    print(f'Final Answer for Question : \"{question}\" --> \\n {final_answer}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:40.804466Z","iopub.execute_input":"2025-01-24T11:13:40.804864Z","iopub.status.idle":"2025-01-24T11:13:40.811543Z","shell.execute_reply.started":"2025-01-24T11:13:40.804831Z","shell.execute_reply":"2025-01-24T11:13:40.810317Z"}},"outputs":[],"execution_count":40},{"cell_type":"code","source":"questions_asked(q_one)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:41.864423Z","iopub.execute_input":"2025-01-24T11:13:41.864853Z","iopub.status.idle":"2025-01-24T11:13:44.195255Z","shell.execute_reply.started":"2025-01-24T11:13:41.864818Z","shell.execute_reply":"2025-01-24T11:13:44.194035Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title: 'Casino'}) RETURN p.name\n========================================\nFinal Answer for Question : \"What was the cast of the Casino?\" --> \n **Cast of Casino**\n====================\nThe main cast of the movie \"Casino\" includes:\n\n* **Robert De Niro**\n* **Joe Pesci**\n* **Sharon Stone**\n* **James Woods**\n\nThese actors played key roles in the film.\n","output_type":"stream"}],"execution_count":41},{"cell_type":"code","source":"questions_asked(q_two)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:44.196910Z","iopub.execute_input":"2025-01-24T11:13:44.197295Z","iopub.status.idle":"2025-01-24T11:13:48.499207Z","shell.execute_reply.started":"2025-01-24T11:13:44.197248Z","shell.execute_reply":"2025-01-24T11:13:48.497744Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (m:Movie)-[:IN_GENRE]->(g:Genre) \nWHERE m.released STARTS WITH '1995' \nRETURN g.name AS Genre, COUNT(m) AS Count \nORDER BY Count DESC;\n========================================\nFinal Answer for Question : \"What are the most common genres for movies released in 1995?\" --> \n **Most Common Genres for Movies Released in 1995**\n\nThe top genres for movies released in 1995 are:\n\n1. **Comedy**: 10 movies\n2. **Adventure**: 6 movies\n3. **Romance**: 5 movies\n4. **Action**: 5 movies\n5. **Children**: 4 movies\n6. **Drama**: 4 movies\n7. **Crime**: 3 movies\n8. **Thriller**: 3 movies\n9. **Fantasy**: 2 movies\n10. **Animation**: 2 movies\n11. **Horror**: 1 movie\n\nThese genres were the most popular among movies released in 1995, with Comedy being the dominant genre.\n","output_type":"stream"}],"execution_count":42},{"cell_type":"code","source":"questions_asked(q_three)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:48.501789Z","iopub.execute_input":"2025-01-24T11:13:48.502210Z","iopub.status.idle":"2025-01-24T11:13:50.728031Z","shell.execute_reply.started":"2025-01-24T11:13:48.502177Z","shell.execute_reply":"2025-01-24T11:13:50.727070Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie)-[:IS_SIMILAR_TO]->(sm:SimilarMovies) RETURN sm.name\n========================================\nFinal Answer for Question : \"What are the similar movies to the ones that Tom Hanks acted in?\" --> \n **Similar Movies to Tom Hanks' Films**\n=====================================\n\n### Results\n\nBased on the movies that Tom Hanks has acted in, we found the following similar movie:\n\n* **Finding Nemo**\n\n### Summary\n\nIf you enjoyed watching movies featuring Tom Hanks, you might also like **Finding Nemo**, which shares similar themes or elements with his films.\n","output_type":"stream"}],"execution_count":43},{"cell_type":"code","source":"questions_asked(\"From the movies that took place in United States, how many had the action or adventure genre?\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:50.729126Z","iopub.execute_input":"2025-01-24T11:13:50.729430Z","iopub.status.idle":"2025-01-24T11:13:54.658003Z","shell.execute_reply.started":"2025-01-24T11:13:50.729404Z","shell.execute_reply":"2025-01-24T11:13:54.656699Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (m:Movie)-[:WAS_TAKEN_IN]->(l:location {name: 'United States'})-[:IN_GENRE]->(g:Genre) \nWHERE g.name IN ['Action', 'Adventure'] \nRETURN COUNT(m)\n========================================\nFinal Answer for Question : \"From the movies that took place in United States, how many had the action or adventure genre?\" --> \n **Query Results**\n\n* **Location:** United States\n* **Genre:** Action or Adventure\n* **Number of Movies:** 0\n\n**Answer:** There are no movies that took place in the United States with the Action or Adventure genre in the database.\n","output_type":"stream"}],"execution_count":44},{"cell_type":"code","source":"questions_asked(\"How Many Movies are there in Action genre?\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:54.658952Z","iopub.execute_input":"2025-01-24T11:13:54.659245Z","iopub.status.idle":"2025-01-24T11:13:56.857062Z","shell.execute_reply.started":"2025-01-24T11:13:54.659215Z","shell.execute_reply":"2025-01-24T11:13:56.855856Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (m:Movie)-[:IN_GENRE]->(g:Genre {name: 'Action'}) RETURN count(m)\n========================================\nFinal Answer for Question : \"How Many Movies are there in Action genre?\" --> \n **Movie Count in Action Genre**\n==========================\n\n* **Genre:** Action\n* **Number of Movies:** 5\n\nThere are **5** movies in the Action genre.\n","output_type":"stream"}],"execution_count":45},{"cell_type":"code","source":"questions_asked(\"which movie did Powers Boothe act in?\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:13:57.113677Z","iopub.execute_input":"2025-01-24T11:13:57.114195Z","iopub.status.idle":"2025-01-24T11:14:00.143745Z","shell.execute_reply.started":"2025-01-24T11:13:57.114151Z","shell.execute_reply":"2025-01-24T11:14:00.142657Z"}},"outputs":[{"name":"stdout","text":"Cypher Query Generated : MATCH (p:Person {name: \"Powers Boothe\"})-[:ACTED_IN]->(m:Movie) RETURN m.title\n========================================\nFinal Answer for Question : \"which movie did Powers Boothe act in?\" --> \n **Movie Credits for Powers Boothe**\n\nPowers Boothe acted in the following movies:\n* **Sudden Death**\n* **Nixon**\n\nThese films showcase his talent as an actor in different roles.\n","output_type":"stream"}],"execution_count":46},{"cell_type":"markdown","source":"---\n**Implementing a proper Graph Q&A agent and enabling interactions with a graph database takes more time compared to using GraphRAG. Having a good understanding of how to design and build a proper knowledge graph is highly beneficial for Q&A systems. This knowledge helps streamline the process, as it allows you to clearly define what information you need and how to retrieve it effectively.**\n\n---","metadata":{}},{"cell_type":"markdown","source":"## Doing Graph RAG\n---\n\nThe Next Step: Building RAG for Textual fields in GraphDB\nBuilding upon this enhanced CypherQAChain, the third stage involves integrating Retrieval-Augmented Generation (RAG) with vector indexes. By creating vector embeddings for specific database fields, we can retrieve semantically similar unstructured data field node for more complicated queries which have actual answer stored in Unstructured data field. This RAG-based approach adds another layer of semantic understanding (when used in parallel with CypherQAChain), enabling even more precise and context-rich responses.\n\nThis progression— from a 1️⃣ basic CypherQAChain to ➡️ 2️⃣ entity mapping and eventually ➡️ 3️⃣ RAG integration— is the path we can take to create our chatbot depending upon the type of improvement or searching we requires.\n\nApart from this, there is also 4️⃣ method which is much more robust then above all as it combined both RAG and Query Gerneration approach, which uses hybrid search or Agentic system to select which method to use or **if possible executing both in parallel and combining the result of RAG with Result retrieved from Query Generated and Giving the Final Answer.**\n\n---","metadata":{}},{"cell_type":"markdown","source":"We will now perform a vector search using the embeddings we created earlier. Specifically, we will use the question's embeddings to query the vector index in the graph database and retrieve relevant results.\n\n**NOTE:** Currently, we are relying only on the 'movie_detail' column of the data for retrieving answers which we synthtically created earlier by combining all the Columns information. When using vector search in the graph database based on a single column, it's important to ensure that this column contains all the necessary information for accurate results.","metadata":{}},{"cell_type":"code","source":"question = \"What are the movies about the Crime ?\"\nquestion_embeddings = embed_text(question)\nquestion_embeddings[:10]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:06.858305Z","iopub.execute_input":"2025-01-24T11:14:06.858742Z","iopub.status.idle":"2025-01-24T11:14:07.174232Z","shell.execute_reply.started":"2025-01-24T11:14:06.858677Z","shell.execute_reply":"2025-01-24T11:14:07.172985Z"}},"outputs":[{"execution_count":47,"output_type":"execute_result","data":{"text/plain":"[0.02048073336482048,\n -0.15319082140922546,\n 0.05562968552112579,\n 0.12678958475589752,\n -0.0365048311650753,\n 0.031025417149066925,\n 0.018207605928182602,\n 0.050932206213474274,\n -0.12333308160305023,\n -0.004759357776492834]"},"metadata":{}}],"execution_count":47},{"cell_type":"code","source":"result = graph.query(\"\"\"\nwith $question_embedding as question_embedding\nCALL db.index.vector.queryNodes(\n    'movie_detail_embeddings',\n    $top_k,\n    question_embedding\n    ) YIELD node AS movie, score\nRETURN movie.title, movie.movie_detail, score\n\"\"\",\nparams={\n    \"question_embedding\":question_embeddings,\n    \"top_k\":3\n})\nprint(result)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:07.593446Z","iopub.execute_input":"2025-01-24T11:14:07.593894Z","iopub.status.idle":"2025-01-24T11:14:08.436238Z","shell.execute_reply.started":"2025-01-24T11:14:07.593857Z","shell.execute_reply":"2025-01-24T11:14:08.435074Z"}},"outputs":[{"name":"stdout","text":"[{'movie.title': 'Casino', 'movie.movie_detail': 'Movie Casino is directed by Martin Scorsese having actors named Robert De Niro , Joe Pesci , Sharon Stone , James Woods and it is movie of the genre in Drama , Crime. It has a rating of 8.2 and it is released in 1995-11-22', 'score': 0.7615904808044434}, {'movie.title': 'Money Train', 'movie.movie_detail': 'Movie Money Train is directed by Joseph Ruben having actors named Wesley Snipes , Robert Blake , Woody Harrelson , Jennifer Lopez and it is movie of the genre in Crime , Comedy , Thriller , Drama , Action. It has a rating of 5.6 and it is released in 1995-11-22', 'score': 0.7555074691772461}, {'movie.title': 'Dracula: Dead and Loving It', 'movie.movie_detail': 'Movie Dracula: Dead and Loving It is directed by Mel Brooks having actors named Peter MacNicol , Leslie Nielsen , Steven Weber , Amy Yasbeck and it is movie of the genre in Comedy , Horror. It has a rating of 5.8 and it is released in 1995-12-22', 'score': 0.7412199974060059}]\n","output_type":"stream"}],"execution_count":48},{"cell_type":"code","source":"# since these tagline's are randomly created, the movie may not be trule representing the expected answer as \n# answer is retrived on the basis of vector simillarity with the Tagline_embeddings\nimport pprint\npprint.pprint(result)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:08.437822Z","iopub.execute_input":"2025-01-24T11:14:08.438254Z","iopub.status.idle":"2025-01-24T11:14:08.451328Z","shell.execute_reply.started":"2025-01-24T11:14:08.438210Z","shell.execute_reply":"2025-01-24T11:14:08.450095Z"}},"outputs":[{"name":"stdout","text":"[{'movie.movie_detail': 'Movie Casino is directed by Martin Scorsese having '\n                        'actors named Robert De Niro , Joe Pesci , Sharon '\n                        'Stone , James Woods and it is movie of the genre in '\n                        'Drama , Crime. It has a rating of 8.2 and it is '\n                        'released in 1995-11-22',\n  'movie.title': 'Casino',\n  'score': 0.7615904808044434},\n {'movie.movie_detail': 'Movie Money Train is directed by Joseph Ruben having '\n                        'actors named Wesley Snipes , Robert Blake , Woody '\n                        'Harrelson , Jennifer Lopez and it is movie of the '\n                        'genre in Crime , Comedy , Thriller , Drama , Action. '\n                        'It has a rating of 5.6 and it is released in '\n                        '1995-11-22',\n  'movie.title': 'Money Train',\n  'score': 0.7555074691772461},\n {'movie.movie_detail': 'Movie Dracula: Dead and Loving It is directed by Mel '\n                        'Brooks having actors named Peter MacNicol , Leslie '\n                        'Nielsen , Steven Weber , Amy Yasbeck and it is movie '\n                        'of the genre in Comedy , Horror. It has a rating of '\n                        '5.8 and it is released in 1995-12-22',\n  'movie.title': 'Dracula: Dead and Loving It',\n  'score': 0.7412199974060059}]\n","output_type":"stream"}],"execution_count":49},{"cell_type":"markdown","source":"---\n### Generating the final Answer with the Retrived Result\n---","metadata":{}},{"cell_type":"code","source":"prompt = f\"# Question:\\n{question}\\n\\n# Graph DB search results:\\n{result}\"\nmessages = [\n    {\"role\": \"system\", \"content\": str(\n        \"You will be given the user question along with the search result of that question over a Neo4j graph database. Give the user the proper answer.\"\n    )},\n    {\"role\": \"user\", \"content\": prompt}\n]\n\nresponse = llm_model.invoke(messages)\n\nprint(response.content)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:11.309472Z","iopub.execute_input":"2025-01-24T11:14:11.309912Z","iopub.status.idle":"2025-01-24T11:14:12.201762Z","shell.execute_reply.started":"2025-01-24T11:14:11.309874Z","shell.execute_reply":"2025-01-24T11:14:12.200631Z"}},"outputs":[{"name":"stdout","text":"Based on the search results, the movies about crime are:\n\n1. **Casino** (1995) - a drama and crime movie directed by Martin Scorsese, starring Robert De Niro, Joe Pesci, and Sharon Stone, with a rating of 8.2.\n2. **Money Train** (1995) - a crime, comedy, thriller, drama, and action movie directed by Joseph Ruben, starring Wesley Snipes, Robert Blake, and Woody Harrelson, with a rating of 5.6.\n\nNote that while **Dracula: Dead and Loving It** is also a movie released in 1995, it does not fall under the crime genre, so it is not included in the list of crime movies.\n","output_type":"stream"}],"execution_count":50},{"cell_type":"code","source":"def rag_pipeline(question:str):\n    question_embeddings = embed_text(question)\n    result = graph.query(\"\"\"\nwith $question_embedding as question_embedding\nCALL db.index.vector.queryNodes(\n    'movie_detail_embeddings',\n    $top_k,\n    question_embedding\n    ) YIELD node AS movie, score\nRETURN movie.title, movie.tagline, score\n\"\"\",\nparams={\n    \"question_embedding\":question_embeddings,\n    \"top_k\":5\n})\n    prompt = f\"# Question:\\n{question}\\n\\n# Graph DB search results:\\n{result}\"\n    messages = [\n    {\"role\": \"system\", \"content\": str(\n        \"You will be given the user question along with the search result of that question over a Neo4j graph database. Give the user the proper answer.\"\n    )},\n    {\"role\": \"user\", \"content\": prompt}\n]\n\n    response = llm_model.invoke(messages)\n    return response\n    \n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:13.226356Z","iopub.execute_input":"2025-01-24T11:14:13.226692Z","iopub.status.idle":"2025-01-24T11:14:13.233348Z","shell.execute_reply.started":"2025-01-24T11:14:13.226664Z","shell.execute_reply":"2025-01-24T11:14:13.232121Z"}},"outputs":[],"execution_count":51},{"cell_type":"code","source":"answer = rag_pipeline(\"What all are the movies about the Adventures ?\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:16.005823Z","iopub.execute_input":"2025-01-24T11:14:16.006212Z","iopub.status.idle":"2025-01-24T11:14:17.354527Z","shell.execute_reply.started":"2025-01-24T11:14:16.006184Z","shell.execute_reply":"2025-01-24T11:14:17.353244Z"}},"outputs":[],"execution_count":52},{"cell_type":"code","source":"print(answer.content)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:17.356777Z","iopub.execute_input":"2025-01-24T11:14:17.357346Z","iopub.status.idle":"2025-01-24T11:14:17.362455Z","shell.execute_reply.started":"2025-01-24T11:14:17.357295Z","shell.execute_reply":"2025-01-24T11:14:17.361420Z"}},"outputs":[{"name":"stdout","text":"Based on the search results, here are some movies about adventures:\n\n1. **Toy Story** \n2. **Tom and Huck** \n3. **Balto** \n4. **Ace Ventura: When Nature Calls** \n5. **Jumanji** \n\nThese movies are likely to be about adventures, although the exact plot and type of adventure may vary. If you're looking for more specific information or a particular type of adventure movie, please let me know and I can try to help you further.\n","output_type":"stream"}],"execution_count":53},{"cell_type":"code","source":"answer = rag_pipeline(\"which movie did powers Boothe act in?\")\nprint(answer.content)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:14:17.949550Z","iopub.execute_input":"2025-01-24T11:14:17.949952Z","iopub.status.idle":"2025-01-24T11:14:19.405802Z","shell.execute_reply.started":"2025-01-24T11:14:17.949919Z","shell.execute_reply":"2025-01-24T11:14:19.404828Z"}},"outputs":[{"name":"stdout","text":"Powers Boothe acted in the following movies:\n\n1. Sudden Death\n2. Nixon\n3. The American President\n4. Waiting to Exhale\n5. Balto\n\nThese are the top 5 movie results from the search. If you're looking for a specific movie, please let me know and I can try to provide more information.\n","output_type":"stream"}],"execution_count":54},{"cell_type":"markdown","source":"### Further Improvement : So far cypher query search and RAG search are seperately shown but as per usecase it will be best fit to use Hybrid search, agentic search (selecting which search should be performed) or executing both the CypherQuery search and RAG search and then feeding the retrieved result to LLMs for final answer generationg, though it will take time to give answer but possibility of it giving correct answer increases.","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}